home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Stream.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-15
|
7KB
|
264 lines
#ifndef Stream_First
#ifdef __GNUG__
//pragma once
#pragma interface
#endif
#define Stream_First
#include "Types.h"
#ifndef BUFSIZE
#define BUFSIZE 4096
#endif
#ifndef EOF
#define EOF (-1)
#endif EOF
#define SP << ' '
#define NL << '\n'
#define TAB << '\t'
enum state_value {
_good = 0,
_eof = 1,
_fail = 2
};
class ObjArray;
class Object;
class OrdCollection;
enum TypeTags {
eTNone,
eTChar,
eTUChar,
eTShort,
eTUShort,
eTInt,
eTUInt,
eTLong,
eTULong,
eTFloat,
eTDouble,
eTString,
eTUString,
eTStream,
eTVoid
};
//---- Stream ------------------------------------------------------------------
class Stream {
protected:
ObjArray *it;
bool deepclone;
bool delete_StreamBuf;
class StreamBuf* bp;
short state;
Stream(StreamBuf* s, bool dodelete= FALSE);
public:
virtual ~Stream();
void Push(StreamBuf *s);
void Pop();
operator void*()
{ return _eof < state ? 0 : this; }
int operator!()
{ return _eof < state; }
int eof()
{ return state & _eof; }
int fail()
{ return _eof < state; }
int bad()
{ return _fail < state; }
int good()
{ return state == _good; }
void setstate(state_value st)
{ state= st; }
void clear()
{ state= _good; }
int rdstate()
{ return state; }
char* bufptr();
StreamBuf* getsbuf()
{ return bp; }
long tell();
// object table management
ObjArray *Table();
int IndexOfPtr(Object *op);
Object *At(int ix);
void AtPut(int ix, Object *op);
void PrepareForDeepClone()
{ deepclone= TRUE; }
bool IsForDeepClone()
{ return deepclone; }
int MakeIndex(Object *op);
static void InvalidatePtr(Object*);
private:
static OrdCollection *all;
};
//---- OStream -----------------------------------------------------------------
class IStream;
class OStream : public Stream {
static double dd;
public:
OStream(StreamBuf* s, bool dodelete= FALSE);
OStream(int fd);
OStream(int fd, char *p, int size);
OStream(int size, char *p);
OStream(char *path);
~OStream();
OStream& flush();
OStream& form(char* va_alist, ...);
OStream& put(char);
OStream& put(u_char);
OStream& seek(long pos, bool relative= FALSE);
OStream& rewind()
{ return seek(0); }
long tell();
int write(const u_char *s, int n);
int write(const char *s, int n)
{ return write((const u_char*)s, n); }
virtual OStream& Print(int code, void *vp);
OStream& operator<< (char c)
{ return Print(eTChar, (void*) c); }
OStream& operator<< (u_char c)
{ return Print(eTUChar, (void*) c); }
OStream& operator<< (const char *s)
{ return Print(eTString, (void*) s); }
OStream& operator<< (const u_char *s)
{ return Print(eTUString, (void*) s); }
OStream& operator<< (long l)
{ return Print(eTLong, (void*) l); }
OStream& operator<< (u_long l)
{ return Print(eTULong, (void*) l); }
OStream& operator<< (short s)
{ return Print(eTShort, (void*) s); }
OStream& operator<< (u_short s)
{ return Print(eTUShort, (void*) s); }
OStream& operator<< (int i)
{ return Print(eTInt, (void*) i); }
OStream& operator<< (u_int i)
{ return Print(eTUInt, (void*) i); }
OStream& operator<< (double d)
{ dd= d; return Print(eTDouble, (void*) &dd); }
OStream& operator<< (float f)
{ dd= f; return Print(eTFloat, (void*) &dd); }
OStream& operator<< (IStream &s)
{ return Print(eTStream, (void*) &s); }
//OStream& operator<< (void *v)
// { return Print(eTVoid, v); }
void PutBigEndian(int bytes, long v);
OStream &PrintString(char *s, int l= -1);
OStream &PrintString(u_char *s, int l= -1)
{ return PrintString((char*)s, l); }
OStream &PrintHexString(char *s, int l);
OStream &PrintHexString(u_char *s, int l)
{ return PrintHexString((char*) s, l); }
};
//---- IStream -----------------------------------------------------------------
/*
The >> operator reads after skipping initial whitespace
get() reads but does not skip whitespace
if >> fails (1) the state of the Stream turns non-zero
(2) the value of the argument does not change
(3) non-whitespace characters are put back onto the Stream
>> get() fails if the state of the Stream is non-zero
*/
class IStream : public Stream {
OStream* tied_to;
public:
IStream(StreamBuf *s, OStream *t= 0, bool dodelete= FALSE); // bind to buffer
IStream(int size, char *p); // bind to string
IStream(int fd, OStream *t= 0); // bind to file
IStream(char *path);
void flush()
{ if (tied_to) tied_to->flush(); }
operator void*()
{ return Stream::operator void*(); }
void eatwhite();
IStream& putback(char c);
IStream& seek(long pos, bool relative= FALSE);
IStream& rewind()
{ return seek(0); }
long tell();
OStream* tie(OStream* s);
int read(u_char *s, int n);
int read(char *s, int n)
{ return read((u_char*)s, n); }
// raw input: get's do not skip whitespace
IStream& get(char*, int, char= '\n'); // string
IStream& get(char &c); // single character
IStream& get(u_char &b); // single unsigned character
IStream& peek(char &c);
IStream& peek(u_char &b);
// formatted input: >> skip whitespace
virtual IStream& Scan(int code, void *vp);
IStream& operator>> (char *v)
{ return Scan(eTString, v); }
IStream& operator>> (u_char *v)
{ return Scan(eTUString, v); }
IStream& operator>> (char &v)
{ return Scan(eTChar, &v); }
IStream& operator>> (u_char &v)
{ return Scan(eTUChar, &v); }
IStream& operator>> (short &v)
{ return Scan(eTShort, &v); }
IStream& operator>> (u_short &v)
{ return Scan(eTUShort, &v); }
IStream& operator>> (int &v)
{ return Scan(eTInt, &v); }
IStream& operator>> (u_int &v)
{ return Scan(eTUInt, &v); }
IStream& operator>> (long &v)
{ return Scan(eTLong, &v); }
IStream& operator>> (u_long &v)
{ return Scan(eTULong, &v); }
IStream& operator>> (float &v)
{ return Scan(eTFloat, &v); }
IStream& operator>> (double &v)
{ return Scan(eTDouble, &v); }
//IStream& operator>> (Stream &v)
// { return Scan(eTStream, &v); }
long GetBigEndian(int bytes);
char GetChar();
u_char GetByte();
u_char GetHex();
IStream &ReadString(char **s, int *lp= 0);
IStream &ReadString(u_char **s, int *lp= 0)
{ return ReadString((char**)s, lp); }
};
extern IStream cin; // standard input predefined
extern OStream cout; // standard output
extern OStream cerr; // error output
#endif